export type SelectChangeCallback = (selectedValue: any) => void;
export type SelectVisibleChangeCallback = (visible: boolean) => void;
export type SelectRemoveTagCallback = (removedTagValue: any) => void;
export type SelectClearCallback = () => void;
export type SelectBlurCallback = (event: Event) => void;
export type SelectFocusCallback = (event: Event) => void;

export interface SelectProps {
  /**
   * 是否多选
   */
  multiple?: boolean;
  /**
   * 是否禁用
   */
  disabled?: boolean;
  /**
   * 作为 value 唯一标识的键名，绑定值为对象类型时必填
   */
  valueKey?: string;
  /**
   * 输入框尺寸
   */
  size?: "medium" | "small" | "mini";
  /**
   * 是否可以清空选项
   */
  clearable?: boolean;
  /**
   * 多选时是否将选中值按文字的形式展示
   */
  collapseTags?: boolean;
  /**
   * 多选时用户最多可以选择的项目数，为 0 则不限制
   */
  multipleLimit?: number;
  /**
   * select input 的 name 属性
   */
  name?: string;
  /**
   * select input 的 autocomplete 属性
   */
  autocomplete?: string;
  /**
   * 下个主版本弃用
   */
  autoComplete?: string;
  /**
   * 占位符
   */
  placeholder?: string;
  /**
   * 是否可搜索
   */
  filterable?: boolean;
  /**
   * 是否允许用户创建新条目，需配合 filterable 使用
   */
  allowCreate?: boolean;
  /**
   * 自定义搜索方法
   */
  filterMethod?: () => void;
  /**
   * 是否为远程搜索
   */
  remote?: boolean;
  /**
   * 远程搜索方法
   */
  remoteMethod?: () => void;
  /**
   * 是否正在从远程获取数据
   */
  loading?: boolean;
  /**
   * 远程加载时显示的文字
   */
  loadingText?: string;
  /**
   * 搜索条件无匹配时显示的文字
   */
  noMatchText?: string;
  /**
   * 选项为空时显示的文字
   */
  noDataText?: string;
  /**
   * Select 下拉框的类名
   */
  popperClass?: string;
  /**
   * 多选且可搜索时，是否在选中一个选项后保留当前的搜索关键词
   */
  reserveKeyword?: boolean;
  /**
   * 在输入框按下回车，选择第一个匹配项。需配合 filterable或 remote 使用
   */
  defaultFirstOption?: boolean;
  /**
   * 是否将弹出框插入至 body 元素。在弹出框的定位出现问题时，可将该属性设置为 false
   */
  popperAppendToBody?: boolean;
  /**
   * 对于不可搜索的 Select，是否在输入框获得焦点后自动弹出选项菜单
   */
  automaticDropdown?: boolean;
}

export interface SelectEvents {
  /**
   * 选中值发生变化时触发
   * @param selectedValue 当前选中值
   */
  change?: SelectChangeCallback;
  /**
   * 下拉框出现/隐藏时触发
   * @param visible 出现则为 true，隐藏则为 false
   */
  visibleChange?: SelectVisibleChangeCallback;
  /**
   * 多选模式下移除 tag 时触发
   * @param removedTagValue 移除的 tag 值
   */
  removeTag?: SelectRemoveTagCallback;
  /**
   * 可清空的单选模式下用户点击清空按钮时触发
   */
  clear?: SelectClearCallback;
  /**
   * 当 input 失去焦点时触发
   * @param event 事件对象
   */
  blur?: SelectBlurCallback;
  /**
   * 当 input 获得焦点时触发
   * @param event 事件对象
   */
  focus?: SelectFocusCallback;
}
